package main

import "fmt"

type IntUintFloat interface {
	~int | int8 | float32 | float64 // ~ 表示只要底层类型为 int 的都可作为此类型形参的实参
	// 并集的各个类型之间不能存在交集，也包括底层类型不可存在交集，但是如果相交的类型是接口，则不受这一限制
	// 类型并集不能存在类型形参
	// 接口不能直接或者间接并入自己
	// 带方法的接口不能写入接口的类型并集中

	/*
				~ 后面不可跟 接口
					后面必须是基础类型
		带方法的接口即一般接口不可作为 类型约束类型并集的成员

			interface{} 等价于 any 关键字
			comparable接口 代表所有可使用 == != 比较的类型
	*/
}

type ReadWriter interface {
	~string | ~[]rune
	Read(p []byte) (n int, err error)
	Write(p []byte) (n int, err error)
	/*
			此接口代表了一个类型集合，所有以 string 或者 []rune 为底层类型，并实现了 规定两个方法的类型都在此类型集合中
		一般接口不能用于定义变量，只可用于泛型的类型约束中
	*/

}

// 泛型接口
type DataProcessor[T any] interface {
	Process(oriData T) (newData T)
	Save(data T) error
}

type DataProcessor2[T any] interface {
	int | ~struct{ Data interface{} }
	Process(data T) (newData T)
	Save(data T) error
}

type Slice[T IntUintFloat] []T

type Myint int

func main() {
	var s1 = Slice[int]{1, 2, 3}
	fmt.Println(s1)
	var s2 = Slice[float64]{1.2, 2, 6}
	fmt.Println(s2)

	var s3 = Slice[Myint]{100, 20} // Myint 的底层类型为 int
	fmt.Println(s3)

}
